import axios from 'axios';

// 定义基础URL
const baseURL = '/api';
const timeout = 5000
/**
 * @description: axios二次封装类，用于创建和管理HTTP请求
 * @author: Forever丿顾北
 */
class HttpRequest {
  /**
   * @description: 构造函数，初始化axios实例和基础配置
   * @param {string} baseURL - 请求的基础URL
   */
  constructor(baseURL) {
    this.baseURL = baseURL;
    this.timeout = timeout
  }

  /**
   * @description: 获取内部配置，包括基础URL、头部和超时设置
   * @returns {Object} 配置对象
   */
  getInsideConfig() {
    return {
      baseURL: this.baseURL,
      headers: {},
      timeout: this.timeout
    };
  }

  /**
   * @description: 添加请求和响应拦截器到axios实例
   * @param {Object} instance - axios实例
   */
  interception(instance) {
    // 请求拦截器
    instance.interceptors.request.use(
      config => {
        // 在发送请求之前做些什么
        // 例如：添加token到headers
        // config.headers.Authorization = `Bearer ${token}`;
        return config;
      },
      error => {
        // 对请求错误做些什么
        return Promise.reject(error);
      }
    );

    // 响应拦截器
    instance.interceptors.response.use(
      response => {
        // 对响应数据做点什么
        // 例如：处理响应数据
        return response;
      },
      error => {
        // 对响应错误做点什么
        return Promise.reject(error);
      }
    );
  }

  /**
   * @description: 发送请求的方法，合并内部配置和用户提供的配置
   * @param {Object} options - 用户提供的请求配置
   * @returns {Promise} axios请求的Promise
   */
  request(options) {
    // 合并配置
    options = { ...this.getInsideConfig(), ...options };
    // 创建axios实例
    const instance = axios.create(options);
    // 添加拦截器
    this.interception(instance);
    // 发送请求
    return instance(options);
  }
}

// 创建HttpRequest实例
const requestInstance = new HttpRequest(baseURL);

// 导出HttpRequest实例
export default requestInstance;